import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.ElementType;
import java.util.Properties;

/**
 * 关于java.lang.Class的理解
 * 1. 类的加载过程：
 *   程序经过javac.exe命令后，会生成一个或多个字节码文件(.class结尾)。
 *   接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件
 *   加载到内存中。此过程就称为类的加载。加载到内存中的类，我们就称为运行时类，此运行时类
 *   就作为Class的一个实例。
 *
 * 2. 换句话说，Class的实例就对应着一个运行时类。
 * 3. 加载到内存中的运行时类，会缓存一定的时间。在此时间之内。我们可以通过不同的方式
 *   来获取此运行时类。
 *
 */
public class ClassTest1 {
    /*
    获取Class实例的方式
     */
    @Test
    public void test1() throws ClassNotFoundException {
        //方式一：调用运行时类的属性：.class
        Class clazz1 = Person.class;
        System.out.println(clazz1);
        //方式二：通过运行时类的对象，调用getClass()
        Person p1 = new Person();
        Class clazz2 = p1.getClass();
        System.out.println(clazz2);
        //(用的较多)方式三：调用Class的静态方法：forName(String classPath)
        Class clazz3 = Class.forName("Person");
        System.out.println(clazz3);
        //了解：方式四：使用类的加载器：ClassLoader
        ClassLoader classLoader = ClassTest1.class.getClassLoader();
        Class clazz4 = classLoader.loadClass("Person");
        System.out.println(clazz4);
    }
    /*
    Class实例可以是哪些结构的说明
     */
    @Test
    public void test2()
    {
        Class<Object> c1 = Object.class;
        Class<Comparable> c2 = Comparable.class;
        Class<String[]> c3 = String[].class;
        Class<int[][]> c4 = int[][].class;
        Class<ElementType> c5 = ElementType.class;
        Class<Override> c6 = Override.class;
        Class<Integer> c7 = int.class;
        Class<Void> c8 = void.class;
        Class<Class> c9 = Class.class;
        int a[] = new int[10];
        int b[] = new int[100];
        Class<? extends int[]> c10 = a.getClass();
        Class<? extends int[]> c11 = b.getClass();
        //只要数组的元素类型与维度一样，就是同一个class
        System.out.println(c10 == c11);
    }

    /*
    properties:用来读取配置文件。
     */
    @Test
    public void test3() throws IOException {

        Properties pros = new Properties();
        //此时的文件默认在当下的module下
        //读取配置文件的方式一：
//        FileInputStream fis = new FileInputStream("jdbc.properties");
//        pros.load(fis);

        //读取配置文件的方式二：使用ClassLoader
        //配置文件默认识别为：当前module的src下
        ClassLoader classLoader = ClassTest1.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("jdbc1.properties");
        pros.load(is);


        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        System.out.println("user="+user+",password"+password);
    }
}
